package threadTest.auxiliaryUtils;

import java.util.Arrays;
import java.util.List;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 * 功能描述: CyclicBarrier 支持一个可选的 Runnable 命令，在一组线程中的最后一个线程到达之后（但在释放所有线程之前），
 *          该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态，此屏障操作 很有用
 * 2024/02/22
 * <p>
 * ZhangYi
 */
public class CyclicBarrierTest {
    public static void main(String[] args) {

        List<String> names = Arrays.asList("张三",
                                           "李四",
                                           "王五",
                                           "赵六",
                                           "孙七",
                                           "周八",
                                           "吴九");
        CyclicBarrier barrier = new CyclicBarrier(7,
                                                  new Runnable() {
                                                      @Override
                                                      public void run() {
                                                          System.out.println("人到齐了,上菜吧");
                                                      }
                                                  }); // 7个线程,计数器=7 之后,  通知线程执行run方法

        for (String name : names) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println(name + " 来了");
                    try {
                        barrier.await(); // 等待 计数器+1
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    } catch (BrokenBarrierException e) {
                        throw new RuntimeException(e);
                    }
                }
            },
                       "线程 " + name).start();
        }

    }
}

//class Solver {
//    final int N;
//    final float[][] data;
//    final CyclicBarrier barrier;
//
//    class Worker implements Runnable {
//        int myRow;
//        Worker(int row) { myRow = row; }
//        public void run() {
//            while (!done()) {
//                processRow(myRow);
//
//                try {
//                    barrier.await();
//                } catch (InterruptedException ex) {
//                    return;
//                } catch (BrokenBarrierException ex) {
//                    return;
//                }
//            }
//        }
//    }
//
//    public Solver(float[][] matrix) {
//        data = matrix;
//        N = matrix.length;
//        barrier = new CyclicBarrier(N,
//                                    new Runnable() {
//                                        public void run() {
//                                            mergeRows(...);
//                                        }
//                                    });
//        for (int i = 0; i < N; ++i)
//            new Thread(new Worker(i)).start();
//
//        waitUntilDone();
//    }
//}
